package modelo;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;

public class ProductoDAO {
	private TreeMap<Integer, Producto> elementos = new TreeMap<Integer, Producto>();

	public ProductoDAO() {
		super();
	}
	
	public void cargar() {
		ArrayList<Producto> arr = Datos.getInstancia().leerBaseDatos("producto", new CreadorDato<Producto>() {
			@Override
			public Producto crear(ResultSet rs) throws SQLException {
				Categoria cat = Datos.getInstancia().getCategorias().buscar(rs.getInt("categoria"));
				return new Producto(rs.getInt("codigo"), rs.getString("nombre"), rs.getDouble("precio"), cat);
			}
		});
		
		for (Producto pr : arr)
			elementos.put(pr.getCodigo(), pr);
	}

	public Producto anadir(String nombre, double precio, Categoria cat) {
		try {
			ResultSet rs = Conexion.consultar("INSERT INTO producto (nombre, precio, categoria) VALUES ('" + nombre + "', " + precio + ", " + cat.getCodigo() + ") RETURNING codigo;");
			if (rs.next()) {
				Producto pr = new Producto(rs.getInt("codigo"), nombre, precio, cat); 
				elementos.put(pr.getCodigo(), pr);
				return pr;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public void actualizar(Producto prod) {
		String cadena = "UPDATE producto SET nombre = '" + prod.getNombre() + "', precio = " + prod.getPrecio() + ", categoria = " + prod.getCategoria().getCodigo() + " WHERE codigo = " + prod.getCodigo();
		Conexion.ejecutar(cadena);
	}
	
	public void eliminar(int codigo) {
		String cadena = "DELETE FROM producto WHERE codigo = " + codigo;
		Conexion.ejecutar(cadena);
		elementos.remove(codigo);
	}
	
	public Producto buscar(int codigo) {
		return elementos.get(codigo);
	}
	
	public ArrayList<Producto> productosGeneral() {
		return adjuntarObjeto(Conexion.consultar("SELECT codigo FROM producto"));
	}
	
	public ArrayList<Producto> productosPorCategoria(int categoria) {
		return adjuntarObjeto(Conexion.consultar("SELECT codigo FROM producto WHERE categoria = " + categoria));
	}
	
	public ArrayList<Producto> productosPorIngrediente(int ingrediente) {
		return adjuntarObjeto(Conexion.consultar("SELECT producto AS codigo FROM detalle_producto WHERE ingrediente = " + ingrediente));
	}
	
	private ArrayList<Producto> adjuntarObjeto(ResultSet rs) {
		ArrayList<Producto> lst = new ArrayList<Producto>();
		
		try {
			while (rs.next()) lst.add(elementos.get(rs.getInt("codigo")));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return lst;
	}
}
